package com.hw;

import android.app.Application;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.facebook.stetho.Stetho;
import com.facebook.stetho.okhttp3.StethoInterceptor;
import com.hw.dao.DaoMaster;
import com.hw.dao.DaoSession;
import com.hw.ui.config.ConfigActivity;
import com.hw.ui.login.LoginActivity;
import cat.ereza.customactivityoncrash.CustomActivityOnCrash;
import cat.ereza.customactivityoncrash.config.CaocConfig;
import okhttp3.OkHttpClient;

public class HWApp extends Application {
    public static final String TAG = HWApp.class.getSimpleName();
    public static SharedPreferences sSharedPreferences;
    public static SharedPreferences.Editor sEditor;
    public static final String SHARE_KEY = "SHARE_KEY";
    public static DaoSession daoSession;

    @Override
    public void onCreate() {
        super.onCreate();
        HWApp.sSharedPreferences = getSharedPreferences(SHARE_KEY, MODE_PRIVATE);
        HWApp.sEditor = HWApp.sSharedPreferences.edit();
        initCrash();
        setupDatabase();
        initStetho();
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
    }

    public void initCrash() {
        //BackgroundMode.BACKGROUND_MODE_SHOW_CUSTOM: //当应用程序处于后台时崩溃，也会启动错误页面，
        // BackgroundMode.BACKGROUND_MODE_CRASH:      //当应用程序处于后台崩溃时显示默认系统错误（一个系统提示的错误对话框），
        // BackgroundMode.BACKGROUND_MODE_SILENT:     //当应用程序处于后台时崩溃，默默地关闭程序！这种模式我感觉最好
        CaocConfig.Builder.create().backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT)
                .enabled(true) //这阻止了对崩溃的拦截,false表示阻止。用它来禁用customactivityoncrash框架
                .showErrorDetails(false) //这将隐藏错误活动中的“错误详细信息”按钮，从而隐藏堆栈跟踪。
                .showRestartButton(false) //是否可以重启页面
                .trackActivities(true) //错误页面中显示错误详细信息
                .minTimeBetweenCrashesMs(1500) //定义应用程序崩溃之间的最短时间，以确定我们不在崩溃循环中。比如：在规定的时间内再次崩溃，框架将不处理，让系统处理！
//                .errorDrawable(R.mipmap.ic_launcher) //崩溃页面显示的图标
//                .restartActivity(LoginActivity.class) //重新启动后的页面
//                .errorActivity(ConfigActivity.class) //程序崩溃后显示的页面
                .eventListener(new CustomEventListener())//设置监听
                .apply(); //如果没有任何配置，程序崩溃显示的是默认的设置
        CustomActivityOnCrash.install(this);
    }

    private static class CustomEventListener implements CustomActivityOnCrash.EventListener { //程序崩溃回调
        //程序崩溃回调
        @Override
        public void onLaunchErrorActivity() {
            Log.e(TAG, "onLaunchErrorActivity()");
        }

        //重启程序时回调
        @Override
        public void onRestartAppFromErrorActivity() {
            Log.e(TAG, "onRestartAppFromErrorActivity()");
        }

        //在崩溃提示页面关闭程序时回调
        @Override
        public void onCloseAppFromErrorActivity() {
            Log.e(TAG, "onCloseAppFromErrorActivity()");
        }
    }

    public void setupDatabase() {
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "hw.db", null);
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        daoSession = daoMaster.newSession();
    }

    private void initStetho() {
        Stetho.initializeWithDefaults(this);
        new OkHttpClient.Builder()
                .addNetworkInterceptor(new StethoInterceptor())
                .build();
    }
}
